pspthreadman.h

Go to the documentation of this file.
00001 /*
00002  * PSP Software Development Kit - http://www.pspdev.org
00003  * -----------------------------------------------------------------------
00004  * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
00005  *
00006  * pspthreadman.h - Library imports for the kernel threading library.
00007  *
00008  * Copyright (c) 2005 Marcus R. Brown <mrbrown@ocgnet.org>
00009  * Copyright (c) 2005 James Forshaw <tyranid@gmail.com>
00010  * Copyright (c) 2005 John Kelley <ps2dev@kelley.ca>
00011  * Copyright (c) 2005 Florin Sasu
00012  *
00013  * $Id: pspthreadman.h 2016 2006-10-05 20:29:16Z tyranid $
00014  */
00015 #ifndef __THREADMAN_H__
00016 #define __THREADMAN_H__
00017 
00018 #include <psptypes.h>
00019 #include <pspkerneltypes.h>
00020 /* Include for profile register definitions */
00021 #include <pspdebug.h>
00022 
00023 /* Note: Some of the structures, types, and definitions in this file were
00024    extrapolated from symbolic debugging information found in the Japanese
00025    version of Puzzle Bobble. */
00026 
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034 
00038 
00040 typedef struct SceKernelSysClock {
00041         SceUInt32   low;
00042         SceUInt32   hi;
00043 } SceKernelSysClock;
00044 
00046 enum PspThreadAttributes
00047 {
00049         PSP_THREAD_ATTR_VFPU = 0x00004000,
00052         PSP_THREAD_ATTR_USER = 0x80000000,
00054         PSP_THREAD_ATTR_USBWLAN = 0xa0000000,
00056         PSP_THREAD_ATTR_VSH = 0xc0000000,
00058         PSP_THREAD_ATTR_SCRATCH_SRAM = 0x00008000,
00060         PSP_THREAD_ATTR_NO_FILLSTACK = 0x00100000,
00062         PSP_THREAD_ATTR_CLEAR_STACK = 0x00200000,
00063 };
00064 
00065 /* Maintained for compatibility with older versions of PSPSDK. */
00066 #define THREAD_ATTR_VFPU PSP_THREAD_ATTR_VFPU
00067 #define THREAD_ATTR_USER PSP_THREAD_ATTR_USER
00068 
00069 
00070 /* Threads. */
00071 
00072 typedef int (*SceKernelThreadEntry)(SceSize args, void *argp);
00073 
00075 typedef struct SceKernelThreadOptParam {
00077         SceSize         size;
00079         SceUID          stackMpid;
00080 } SceKernelThreadOptParam;
00081 
00085 typedef struct SceKernelThreadInfo {
00087         SceSize     size;
00089         char            name[32];
00091         SceUInt     attr;
00093         int             status;
00095         SceKernelThreadEntry    entry;
00097         void *          stack;
00099         int             stackSize;
00101         void *          gpReg;
00103         int             initPriority;
00105         int             currentPriority;
00107         int             waitType;
00109         SceUID          waitId;
00111         int             wakeupCount;
00113         int             exitStatus;
00115         SceKernelSysClock   runClocks;
00117         SceUInt     intrPreemptCount;
00119         SceUInt     threadPreemptCount;
00121         SceUInt     releaseCount;
00122 } SceKernelThreadInfo;
00123 
00127 typedef struct SceKernelThreadRunStatus {
00128         SceSize         size;
00129         int             status;
00130         int             currentPriority;
00131         int             waitType;
00132         int             waitId;
00133         int             wakeupCount;
00134         SceKernelSysClock runClocks;
00135         SceUInt         intrPreemptCount;
00136         SceUInt         threadPreemptCount;
00137         SceUInt         releaseCount;
00138 } SceKernelThreadRunStatus;
00139 
00140 /* Sure there must be more than this, but haven't seen them */
00141 enum PspThreadStatus
00142 {
00143         PSP_THREAD_RUNNING = 1,
00144         PSP_THREAD_READY   = 2,
00145         PSP_THREAD_WAITING = 4,
00146         PSP_THREAD_SUSPEND = 8,
00147         PSP_THREAD_STOPPED = 16,
00148         PSP_THREAD_KILLED  = 32, /* Thread manager has killed the thread (stack overflow) */
00149 };
00150 
00169 SceUID sceKernelCreateThread(const char *name, SceKernelThreadEntry entry, int initPriority,
00170                              int stackSize, SceUInt attr, SceKernelThreadOptParam *option);
00171 
00179 int sceKernelDeleteThread(SceUID thid);
00180 
00188 int sceKernelStartThread(SceUID thid, SceSize arglen, void *argp);
00189 
00195 int sceKernelExitThread(int status);
00196 
00202 int sceKernelExitDeleteThread(int status);
00203 
00211 int sceKernelTerminateThread(SceUID thid);
00212 
00220 int sceKernelTerminateDeleteThread(SceUID thid);
00221 
00227 int sceKernelSuspendDispatchThread(void);
00228 
00237 int sceKernelResumeDispatchThread(int state);
00238 
00244 int sceKernelSleepThread(void);
00245 
00255 int sceKernelSleepThreadCB(void);
00256 
00264 int sceKernelWakeupThread(SceUID thid);
00265 
00273 int sceKernelCancelWakeupThread(SceUID thid);
00274 
00282 int sceKernelSuspendThread(SceUID thid);
00283 
00291 int sceKernelResumeThread(SceUID thid);
00292 
00301 int sceKernelWaitThreadEnd(SceUID thid, SceUInt *timeout);
00302 
00311 int sceKernelWaitThreadEndCB(SceUID thid, SceUInt *timeout);
00312 
00323 int sceKernelDelayThread(SceUInt delay);
00324 
00335 int sceKernelDelayThreadCB(SceUInt delay);
00336 
00344 int sceKernelDelaySysClockThread(SceKernelSysClock *delay);
00345 
00354 int sceKernelDelaySysClockThreadCB(SceKernelSysClock *delay);
00355 
00364 int sceKernelChangeCurrentThreadAttr(int unknown, SceUInt attr);
00365 
00381 int sceKernelChangeThreadPriority(SceUID thid, int priority);
00382 
00390 int sceKernelRotateThreadReadyQueue(int priority);
00391 
00399 int sceKernelReleaseWaitThread(SceUID thid);
00400 
00406 int sceKernelGetThreadId(void);
00407 
00413 int sceKernelGetThreadCurrentPriority(void);
00414 
00422 int sceKernelGetThreadExitStatus(SceUID thid);
00423 
00429 int sceKernelCheckThreadStack(void);
00430 
00439 int sceKernelGetThreadStackFreeSize(SceUID thid);
00440 
00458 int sceKernelReferThreadStatus(SceUID thid, SceKernelThreadInfo *info);
00459 
00468 int sceKernelReferThreadRunStatus(SceUID thid, SceKernelThreadRunStatus *status);
00469 
00470 
00471 /* Semaphores. */
00472 
00474 typedef struct SceKernelSemaOptParam {
00476         SceSize         size;
00477 } SceKernelSemaOptParam;
00478 
00482 typedef struct SceKernelSemaInfo {
00484         SceSize         size;
00486         char            name[32];
00488         SceUInt         attr;
00490         int             initCount;
00492         int             currentCount;
00494         int             maxCount;
00496         int             numWaitThreads;
00497 } SceKernelSemaInfo;
00498 
00515 SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);
00516 
00523 int sceKernelDeleteSema(SceUID semaid);
00524 
00539 int sceKernelSignalSema(SceUID semaid, int signal);
00540 
00555 int sceKernelWaitSema(SceUID semaid, int signal, SceUInt *timeout);
00556 
00571 int sceKernelWaitSemaCB(SceUID semaid, int signal, SceUInt *timeout);
00572 
00581 int sceKernelPollSema(SceUID semaid, int signal);
00582 
00591 int sceKernelReferSemaStatus(SceUID semaid, SceKernelSemaInfo *info);
00592 
00593 
00594 /* Event flags. */
00595 
00597 typedef struct SceKernelEventFlagInfo {
00598         SceSize         size;
00599         char            name[32];
00600         SceUInt         attr;
00601         SceUInt         initPattern;
00602         SceUInt         currentPattern;
00603         int             numWaitThreads;
00604 } SceKernelEventFlagInfo;
00605 
00606 struct SceKernelEventFlagOptParam {
00607         SceSize         size;
00608 };
00609 
00610 typedef struct SceKernelEventFlagOptParam SceKernelEventFlagOptParam;
00611 
00613 enum PspEventFlagAttributes
00614 {
00616         PSP_EVENT_WAITMULTIPLE = 0x200
00617 };
00618 
00620 enum PspEventFlagWaitTypes
00621 {
00623         PSP_EVENT_WAITAND = 0,
00625         PSP_EVENT_WAITOR  = 1,
00627         PSP_EVENT_WAITCLEAR = 0x20
00628 };
00629 
00645 SceUID sceKernelCreateEventFlag(const char *name, int attr, int bits, SceKernelEventFlagOptParam *opt);
00646 
00655 int sceKernelSetEventFlag(SceUID evid, u32 bits);
00656 
00665 int sceKernelClearEventFlag(SceUID evid, u32 bits);
00666 
00676 int sceKernelPollEventFlag(int evid, u32 bits, u32 wait, u32 *outBits);
00677 
00688 int sceKernelWaitEventFlag(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
00689 
00700 int sceKernelWaitEventFlagCB(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
00701 
00709 int sceKernelDeleteEventFlag(int evid);
00710 
00719 int sceKernelReferEventFlagStatus(SceUID event, SceKernelEventFlagInfo *status);
00720 
00721 
00722 /* Message boxes. */
00723 
00725 typedef struct SceKernelMbxOptParam {
00727         SceSize         size;
00728 } SceKernelMbxOptParam;
00729 
00733 typedef struct SceKernelMbxInfo {
00735         SceSize         size;
00737         char            name[32];
00739         SceUInt         attr;
00741         int             numWaitThreads;
00743         int             numMessages;
00745         void            *firstMessage;
00746 } SceKernelMbxInfo;
00747 
00762 SceUID sceKernelCreateMbx(const char *name, SceUInt attr, SceKernelMbxOptParam *option);
00763 
00770 int sceKernelDeleteMbx(SceUID mbxid);
00771 
00789 int sceKernelSendMbx(SceUID mbxid, void *message);
00790 
00807 int sceKernelReceiveMbx(SceUID mbxid, void **pmessage, SceUInt *timeout);
00808 
00825 int sceKernelReceiveMbxCB(SceUID mbxid, void **pmessage, SceUInt *timeout);
00826 
00842 int sceKernelPollMbx(SceUID mbxid, void **pmessage);
00843 
00859 int sceKernelCancelReceiveMbx(SceUID mbxid, int *pnum);
00860 
00869 int sceKernelReferMbxStatus(SceUID mbxid, SceKernelMbxInfo *info);
00870 
00871 
00872 /* Alarms. */
00873 
00875 typedef SceUInt (*SceKernelAlarmHandler)(void *common);
00876 
00878 typedef struct SceKernelAlarmInfo {
00881         SceSize         size;
00882         /* The current schedule */
00883         SceKernelSysClock schedule;
00885         SceKernelAlarmHandler handler;
00887         void *          common;
00888 } SceKernelAlarmInfo;
00889 
00898 SceUID sceKernelSetAlarm(SceUInt clock, SceKernelAlarmHandler handler, void *common);
00899 
00909 SceUID sceKernelSetSysClockAlarm(SceKernelSysClock *clock, SceKernelAlarmHandler handler, void *common);
00910 
00918 int sceKernelCancelAlarm(SceUID alarmid);
00919 
00928 int sceKernelReferAlarmStatus(SceUID alarmid, SceKernelAlarmInfo *info);
00929 
00930 /* Callbacks. */
00931 
00933 typedef int (*SceKernelCallbackFunction)(int arg1, int arg2, void *arg);
00934 
00936 typedef struct SceKernelCallbackInfo {
00938         SceSize         size;
00940         char    name[32];
00942         SceUID  threadId;
00944         SceKernelCallbackFunction       callback;
00946         void *  common;
00948         int     notifyCount;
00950         int     notifyArg;
00951 } SceKernelCallbackInfo;
00952 
00968 int sceKernelCreateCallback(const char *name, SceKernelCallbackFunction func, void *arg);
00969 
00979 int sceKernelReferCallbackStatus(SceUID cb, SceKernelCallbackInfo *status);
00980 
00988 int sceKernelDeleteCallback(SceUID cb);
00989 
00998 int sceKernelNotifyCallback(SceUID cb, int arg2);
00999 
01007 int sceKernelCancelCallback(SceUID cb);
01008 
01016 int sceKernelGetCallbackCount(SceUID cb);
01017 
01023 int sceKernelCheckCallback(void);
01024 
01025 /* Misc. */
01026 
01028 enum SceKernelIdListType
01029 {
01030         SCE_KERNEL_TMID_Thread = 1,
01031         SCE_KERNEL_TMID_Semaphore = 2,
01032         SCE_KERNEL_TMID_EventFlag = 3,
01033         SCE_KERNEL_TMID_Mbox = 4,
01034         SCE_KERNEL_TMID_Vpl = 5,
01035         SCE_KERNEL_TMID_Fpl = 6,
01036         SCE_KERNEL_TMID_Mpipe = 7,
01037         SCE_KERNEL_TMID_Callback = 8,
01038         SCE_KERNEL_TMID_ThreadEventHandler = 9,
01039         SCE_KERNEL_TMID_Alarm = 10,
01040         SCE_KERNEL_TMID_VTimer = 11,
01041         SCE_KERNEL_TMID_SleepThread = 64,
01042         SCE_KERNEL_TMID_DelayThread = 65,
01043         SCE_KERNEL_TMID_SuspendThread = 66,
01044         SCE_KERNEL_TMID_DormantThread = 67,
01045 };
01046 
01058 int sceKernelGetThreadmanIdList(enum SceKernelIdListType type, SceUID *readbuf, int readbufsize, int *idcount);
01059 
01061 typedef struct SceKernelSystemStatus {
01063         SceSize         size;
01065         SceUInt         status;
01067         SceKernelSysClock       idleClocks;
01069         SceUInt         comesOutOfIdleCount;
01071         SceUInt         threadSwitchCount;
01073         SceUInt         vfpuSwitchCount;
01074 } SceKernelSystemStatus;
01075 
01083 int sceKernelReferSystemStatus(SceKernelSystemStatus *status);
01084 
01085 
01097 SceUID sceKernelCreateMsgPipe(const char *name, int part, int attr, void *unk1, void *opt);
01098 
01106 int sceKernelDeleteMsgPipe(SceUID uid);
01107 
01120 int sceKernelSendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01121 
01134 int sceKernelSendMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01135 
01147 int sceKernelTrySendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
01148 
01161 int sceKernelReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01162 
01175 int sceKernelReceiveMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
01176 
01188 int sceKernelTryReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
01189 
01199 int sceKernelCancelMsgPipe(SceUID uid, int *psend, int *precv);
01200 
01202 typedef struct SceKernelMppInfo {
01203         SceSize         size;
01204         char    name[32];
01205         SceUInt         attr;
01206         int     bufSize;
01207         int     freeSize;
01208         int     numSendWaitThreads;
01209         int     numReceiveWaitThreads;
01210 } SceKernelMppInfo;
01211  
01220 int sceKernelReferMsgPipeStatus(SceUID uid, SceKernelMppInfo *info);
01221 
01222 /* VPL Functions */
01223 
01224 struct SceKernelVplOptParam {
01225         SceSize         size;
01226 };
01227 
01239 SceUID sceKernelCreateVpl(const char *name, int part, int attr, unsigned int size, struct SceKernelVplOptParam *opt);
01240 
01248 int sceKernelDeleteVpl(SceUID uid);
01249 
01260 int sceKernelAllocateVpl(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
01261 
01272 int sceKernelAllocateVplCB(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
01273 
01283 int sceKernelTryAllocateVpl(SceUID uid, unsigned int size, void **data);
01284 
01293 int sceKernelFreeVpl(SceUID uid, void *data);
01294 
01303 int sceKernelCancelVpl(SceUID uid, int *pnum);
01304 
01306 typedef struct SceKernelVplInfo {
01307         SceSize         size;
01308         char    name[32];
01309         SceUInt         attr;
01310         int     poolSize;
01311         int     freeSize;
01312         int     numWaitThreads;
01313 } SceKernelVplInfo;
01314 
01323 int sceKernelReferVplStatus(SceUID uid, SceKernelVplInfo *info);
01324 
01325 /* FPL Functions */
01326 
01327 struct SceKernelFplOptParam {
01328         SceSize         size;
01329 };
01330 
01343 int sceKernelCreateFpl(const char *name, int part, int attr, unsigned int size, unsigned int blocks, struct SceKernelFplOptParam *opt);
01344 
01352 int sceKernelDeleteFpl(SceUID uid);
01353 
01363 int sceKernelAllocateFpl(SceUID uid, void **data, unsigned int *timeout);
01364 
01374 int sceKernelAllocateFplCB(SceUID uid, void **data, unsigned int *timeout);
01375 
01384 int sceKernelTryAllocateFpl(SceUID uid, void **data);
01385 
01394 int sceKernelFreeFpl(SceUID uid, void *data);
01395 
01404 int sceKernelCancelFpl(SceUID uid, int *pnum);
01405 
01407 typedef struct SceKernelFplInfo {
01408         SceSize         size;
01409         char    name[32];
01410         SceUInt         attr;
01411         int     blockSize;
01412         int     numBlocks;
01413         int     freeBlocks;
01414         int     numWaitThreads;
01415 } SceKernelFplInfo;
01416 
01425 int sceKernelReferFplStatus(SceUID uid, SceKernelFplInfo *info);
01426 
01430 void _sceKernelReturnFromTimerHandler(void);
01431 
01436 void _sceKernelReturnFromCallback(void);
01437 
01446 int sceKernelUSec2SysClock(unsigned int usec, SceKernelSysClock *clock);
01447 
01455 SceInt64 sceKernelUSec2SysClockWide(unsigned int usec);
01456 
01466 int sceKernelSysClock2USec(SceKernelSysClock *clock, unsigned int *low, unsigned int *high);
01467 
01477 int sceKernelSysClock2USecWide(SceInt64 clock, unsigned *low, unsigned int *high);
01478 
01486 int sceKernelGetSystemTime(SceKernelSysClock *time);
01487 
01493 SceInt64 sceKernelGetSystemTimeWide(void);
01494 
01500 unsigned int sceKernelGetSystemTimeLow(void);
01501 
01502 struct SceKernelVTimerOptParam {
01503         SceSize         size;
01504 };
01505 
01514 SceUID sceKernelCreateVTimer(const char *name, struct SceKernelVTimerOptParam *opt);
01515 
01523 int sceKernelDeleteVTimer(SceUID uid);
01524 
01533 int sceKernelGetVTimerBase(SceUID uid, SceKernelSysClock *base);
01534 
01542 SceInt64 sceKernelGetVTimerBaseWide(SceUID uid);
01543 
01552 int sceKernelGetVTimerTime(SceUID uid, SceKernelSysClock *time);
01553 
01561 SceInt64 sceKernelGetVTimerTimeWide(SceUID uid);
01562 
01571 int sceKernelSetVTimerTime(SceUID uid, SceKernelSysClock *time);
01572 
01581 SceInt64 sceKernelSetVTimerTimeWide(SceUID uid, SceInt64 time);
01582 
01590 int sceKernelStartVTimer(SceUID uid);
01591 
01599 int sceKernelStopVTimer(SceUID uid);
01600 
01601 typedef SceUInt (*SceKernelVTimerHandler)(SceUID uid, SceKernelSysClock *, SceKernelSysClock *, void *);
01602 typedef SceUInt (*SceKernelVTimerHandlerWide)(SceUID uid, SceInt64, SceInt64, void *);
01603 
01614 int sceKernelSetVTimerHandler(SceUID uid, SceKernelSysClock *time, SceKernelVTimerHandler handler, void *common);
01615 
01626 int sceKernelSetVTimerHandlerWide(SceUID uid, SceInt64 time, SceKernelVTimerHandlerWide handler, void *common);
01627 
01635 int sceKernelCancelVTimerHandler(SceUID uid);
01636 
01637 typedef struct SceKernelVTimerInfo {
01638         SceSize         size;
01639         char    name[32];
01640         int     active;
01641         SceKernelSysClock       base;
01642         SceKernelSysClock       current;
01643         SceKernelSysClock       schedule;
01644         SceKernelVTimerHandler  handler;
01645         void *  common;
01646 } SceKernelVTimerInfo;
01647 
01656 int sceKernelReferVTimerStatus(SceUID uid, SceKernelVTimerInfo *info);
01657 
01662 void _sceKernelExitThread(void);
01663 
01671 enum SceKernelIdListType sceKernelGetThreadmanIdType(SceUID uid);
01672 
01673 typedef int (*SceKernelThreadEventHandler)(int mask, SceUID thid, void *common);
01674 
01676 typedef struct SceKernelThreadEventHandlerInfo {
01677         SceSize         size;
01678         char    name[32];
01679         SceUID  threadId;
01680         int     mask;
01681         SceKernelThreadEventHandler     handler;
01682         void *  common;
01683 } SceKernelThreadEventHandlerInfo;
01684 
01685 enum ThreadEventIds
01686 {
01687         THREADEVENT_ALL = 0xFFFFFFFF,
01688         THREADEVENT_KERN = 0xFFFFFFF8,
01689         THREADEVENT_USER = 0xFFFFFFF0,
01690         THREADEVENT_CURRENT = 0
01691 };
01692 
01693 enum ThreadEvents
01694 {
01695         THREAD_CREATE = 1,
01696         THREAD_START  = 2,
01697         THREAD_EXIT   = 4,
01698         THREAD_DELETE = 8,
01699 };
01700 
01712 SceUID sceKernelRegisterThreadEventHandler(const char *name, SceUID threadID, int mask, SceKernelThreadEventHandler handler, void *common);
01713 
01721 int sceKernelReleaseThreadEventHandler(SceUID uid);
01722 
01731 int sceKernelReferThreadEventHandlerStatus(SceUID uid, struct SceKernelThreadEventHandlerInfo *info);
01732 
01737 PspDebugProfilerRegs *sceKernelReferThreadProfiler(void);
01738 
01743 PspDebugProfilerRegs *sceKernelReferGlobalProfiler(void);
01744 
01747 #ifdef __cplusplus
01748 }
01749 #endif
01750 
01751 #endif

Generated on Tue Nov 21 11:46:04 2006 for pspsdk-1.0+beta2 by  doxygen 1.4.6